/*     */ package com.zimbra.cs.service.util;
/*     */ 
/*     */ import com.zimbra.common.util.ZimbraLog;
/*     */ import com.zimbra.common.util.tar.TarEntry;
/*     */ import com.zimbra.common.util.tar.TarInputStream;
/*     */ import com.zimbra.common.util.tar.TarOutputStream;
/*     */ import com.zimbra.cs.mailbox.MailItem.Type;
/*     */ import com.zimbra.cs.mailbox.MailItem.UnderlyingData;
/*     */ import com.zimbra.cs.mailbox.MailServiceException;
/*     */ import java.io.File;
/*     */ import java.io.FileInputStream;
/*     */ import java.io.FileOutputStream;
/*     */ import java.io.IOException;
/*     */ import java.io.InputStream;
/*     */ import java.io.OutputStream;
/*     */ import java.io.PrintStream;
/*     */ import java.text.DateFormat;
/*     */ import java.util.ArrayList;
/*     */ import java.util.Arrays;
/*     */ import java.util.Date;
/*     */ import java.util.List;
/*     */ import java.util.Set;
/*     */ import java.util.zip.GZIPInputStream;
/*     */ import java.util.zip.GZIPOutputStream;
/*     */ import org.apache.commons.cli.CommandLine;
/*     */ import org.apache.commons.cli.CommandLineParser;
/*     */ import org.apache.commons.cli.GnuParser;
/*     */ import org.apache.commons.cli.HelpFormatter;
/*     */ import org.apache.commons.cli.Options;
/*     */ import org.apache.commons.cli.UnrecognizedOptionException;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class ItemDataFile
/*     */ {
/*     */   public static void create(String path, OutputStream os)
/*     */     throws IOException
/*     */   {
/*  49 */     create(path, null, "UTF-8", os);
/*     */   }
/*     */   
/*     */   public static void create(String path, Set<MailItem.Type> types, String cset, OutputStream os) throws IOException {
/*  53 */     File f = new File(path);
/*  54 */     TarOutputStream tos = new TarOutputStream(new GZIPOutputStream(os), cset == null ? "UTF-8" : cset);
/*     */     
/*     */ 
/*  57 */     tos.setLongFileMode(2);
/*     */     try {
/*  59 */       if (f.isDirectory()) {
/*  60 */         addDir(f, f.getPath(), types, tos);
/*     */       } else
/*  62 */         addFile(f, f.getParent(), types, tos);
/*     */     } finally {
/*  64 */       tos.close();
/*     */     }
/*     */   }
/*     */   
/*     */   public static void extract(InputStream is) throws IOException {
/*  69 */     extract(is, true, null, null, "UTF-8");
/*     */   }
/*     */   
/*     */   public static void extract(InputStream is, boolean meta, Set<MailItem.Type> types, String cset, String dir) throws IOException
/*     */   {
/*  74 */     byte[] buf = new byte['⠀'];
/*     */     
/*  76 */     TarInputStream tis = new TarInputStream(new GZIPInputStream(is), cset == null ? "UTF-8" : cset);
/*     */     
/*     */ 
/*  79 */     if (dir == null)
/*  80 */       dir = ".";
/*     */     try { TarEntry te;
/*  82 */       while ((te = tis.getNextEntry()) != null)
/*  83 */         if (!skip(types, MailItem.Type.of((byte)te.getMajorDeviceId())))
/*     */         {
/*     */ 
/*     */ 
/*  87 */           File f = new File(dir + File.separator + te.getName());
/*     */           
/*     */ 
/*  90 */           if (!f.getParent().equals("."))
/*  91 */             f.getParentFile().mkdir();
/*  92 */           FileOutputStream out; if (te.getName().endsWith(".meta")) {
/*  93 */             if (!meta)
/*     */               continue;
/*  95 */             System.out.println(f);
/*  96 */             FileOutputStream out = new FileOutputStream(f);
/*  97 */             ItemData id = new ItemData(getData(tis, te));
/*  98 */             out.write(id.encode(2).getBytes("UTF-8"));
/*     */           }
/*     */           else
/*     */           {
/* 102 */             System.out.println(f);
/* 103 */             out = new FileOutputStream(f);
/* 104 */             int in; while ((in = tis.read(buf)) != -1)
/* 105 */               out.write(buf, 0, in);
/*     */           }
/* 107 */           out.close();
/* 108 */           f.setLastModified(te.getModTime().getTime());
/*     */         }
/*     */     } finally {
/* 111 */       tis.close();
/*     */     }
/*     */   }
/*     */   
/*     */   public static void list(InputStream is, PrintStream os) throws IOException {
/* 116 */     list(is, null, "UTF-8", os);
/*     */   }
/*     */   
/*     */   public static void list(InputStream is, Set<MailItem.Type> types, String cset, PrintStream os) throws IOException {
/* 120 */     DateFormat df = DateFormat.getDateTimeInstance(3, 3);
/*     */     
/* 122 */     TarInputStream tis = new TarInputStream(new GZIPInputStream(is), cset == null ? "UTF-8" : cset);
/*     */     
/* 124 */     os.format("%-13s %17s %10s %6s %s\n", new Object[] { "TYPE", "DATE", "SIZE", "METASZ", "PATH" });
/*     */     try {
/* 126 */       TarEntry idEntry = null;
/*     */       TarEntry te;
/* 128 */       while ((te = tis.getNextEntry()) != null) {
/* 129 */         if (te.getName().endsWith(".meta")) {
/* 130 */           if ((idEntry != null) && (!skip(types, MailItem.Type.of((byte)idEntry.getMajorDeviceId())))) {
/* 131 */             os.format("%-13s %17s %10s %6d %s\n", new Object[] { idEntry.getGroupName(), df.format(idEntry.getModTime()), Integer.valueOf(0), Long.valueOf(idEntry.getSize()), idEntry.getName().substring(0, idEntry.getName().indexOf(".meta")) });
/*     */           }
/*     */           
/* 134 */           idEntry = te;
/*     */         } else {
/* 136 */           if (!skip(types, MailItem.Type.of((byte)te.getMajorDeviceId()))) {
/* 137 */             os.format("%-13s %17s %10s %6d %s\n", new Object[] { te.getGroupName(), df.format(te.getModTime()), Long.valueOf(te.getSize()), Long.valueOf(idEntry == null ? 0L : idEntry.getSize()), te.getName() });
/*     */           }
/*     */           
/* 140 */           idEntry = null;
/*     */         }
/*     */       }
/* 143 */       if ((idEntry != null) && (!skip(types, MailItem.Type.of((byte)idEntry.getMajorDeviceId())))) {
/* 144 */         os.format("%-13s %17s %10s %6d %s\n", new Object[] { idEntry.getGroupName(), df.format(idEntry.getModTime()), Integer.valueOf(0), Long.valueOf(idEntry.getSize()), idEntry.getName().substring(0, idEntry.getName().indexOf(".meta")) });
/*     */       }
/*     */     }
/*     */     finally {
/* 148 */       tis.close();
/*     */     }
/*     */   }
/*     */   
/*     */   static byte[] getData(TarInputStream tis, TarEntry te) throws IOException {
/* 153 */     int dsz = (int)te.getSize();
/* 154 */     byte[] data = new byte[dsz];
/*     */     
/* 156 */     if (tis.read(data, 0, dsz) != dsz)
/* 157 */       throw new IOException("archive read err");
/* 158 */     return data;
/*     */   }
/*     */   
/*     */   static boolean skip(Set<MailItem.Type> types, MailItem.Type type) {
/* 162 */     return (types != null) && (!types.contains(type));
/*     */   }
/*     */   
/*     */   static void addDir(File f, String topdir, Set<MailItem.Type> types, TarOutputStream tos) throws IOException {
/* 166 */     String path = f.getPath();
/* 167 */     String[] all = f.list();
/* 168 */     List<File> dirs = new ArrayList();
/* 169 */     List<File> files = new ArrayList();
/*     */     
/* 171 */     Arrays.sort(all);
/* 172 */     for (String file : all) {
/* 173 */       File subf = new File(path + File.separator + file);
/*     */       
/* 175 */       if ((subf.getName().equals("Tags")) && (path.equals(topdir))) {
/* 176 */         addDir(subf, topdir, types, tos);
/* 177 */       } else if (subf.isDirectory()) {
/* 178 */         dirs.add(subf);
/* 179 */       } else if (subf.getName().endsWith(".meta")) {
/* 180 */         file = subf.getPath().substring(0, subf.getPath().indexOf(".meta"));
/*     */         
/* 182 */         f = new File(file);
/* 183 */         if ((!f.exists()) || (f.isDirectory()))
/* 184 */           files.add(f);
/*     */       } else {
/* 186 */         files.add(subf);
/*     */       }
/*     */     }
/* 189 */     for (File file : files)
/* 190 */       addFile(file, topdir, types, tos);
/* 191 */     for (File dir : dirs)
/* 192 */       addDir(dir, topdir, types, tos);
/*     */   }
/*     */   
/*     */   static void addFile(File f, String topdir, Set<MailItem.Type> types, TarOutputStream tos) throws IOException {
/* 196 */     ItemData id = null;
/* 197 */     String path = f.getPath();
/* 198 */     File mf = new File(path + ".meta");
/*     */     
/*     */ 
/*     */ 
/* 202 */     if (path.indexOf(topdir) == 0)
/* 203 */       path = path.substring(topdir.length() + 1);
/* 204 */     path = path.replace('\\', '/');
/* 205 */     if (mf.exists()) {
/* 206 */       byte[] meta = new byte[(int)mf.length()];
/* 207 */       FileInputStream fis = new FileInputStream(mf);
/*     */       
/* 209 */       if (fis.read(meta) != mf.length()) {
/* 210 */         throw new IOException("meta read err: " + f.getPath());
/*     */       }
/* 212 */       fis.close();
/* 213 */       id = new ItemData(meta);
/* 214 */       MailItem.Type type = MailItem.Type.of(id.ud.type);
/* 215 */       if (skip(types, type)) {
/* 216 */         return;
/*     */       }
/* 218 */       TarEntry te = new TarEntry(path + ".meta");
/* 219 */       System.out.println(te.getName());
/* 220 */       te.setGroupName(MailItem.Type.of(id.ud.type).toString());
/* 221 */       te.setMajorDeviceId(id.ud.type);
/* 222 */       te.setModTime(mf.lastModified());
/* 223 */       te.setSize(meta.length);
/* 224 */       tos.putNextEntry(te);
/* 225 */       tos.write(meta);
/* 226 */       tos.closeEntry(); } else { MailItem.Type type;
/*     */       MailItem.Type type;
/* 228 */       if ((path.endsWith(".csv")) || (path.endsWith(".vcf"))) {
/* 229 */         type = MailItem.Type.CONTACT; } else { MailItem.Type type;
/* 230 */         if (path.endsWith(".eml")) {
/* 231 */           type = MailItem.Type.MESSAGE; } else { MailItem.Type type;
/* 232 */           if (path.endsWith(".ics")) { MailItem.Type type;
/* 233 */             if (path.startsWith("Tasks/")) {
/* 234 */               type = MailItem.Type.TASK;
/*     */             } else
/* 236 */               type = MailItem.Type.APPOINTMENT;
/*     */           } else { MailItem.Type type;
/* 238 */             if (path.endsWith(".wiki")) {
/* 239 */               type = MailItem.Type.WIKI;
/*     */             } else
/* 241 */               type = MailItem.Type.DOCUMENT;
/*     */           } } }
/* 243 */       if (skip(types, type)) {}
/*     */       
/*     */       return;
/*     */     }
/*     */     TarEntry te;
/* 248 */     if ((f.exists()) && (!f.isDirectory()) && ((id != null) || (types == null))) {
/* 249 */       byte[] buf = new byte['⠀'];
/* 250 */       FileInputStream fis = new FileInputStream(f);
/*     */       
/*     */ 
/* 253 */       te = new TarEntry(path);
/* 254 */       System.out.println(te.getName());
/* 255 */       te.setGroupName(MailItem.Type.of(id.ud.type).toString());
/* 256 */       te.setMajorDeviceId(id.ud.type);
/* 257 */       te.setModTime(mf.lastModified());
/* 258 */       te.setSize(f.length());
/* 259 */       tos.putNextEntry(te);
/* 260 */       int in; while ((in = fis.read(buf)) > 0)
/* 261 */         tos.write(buf, 0, in);
/* 262 */       fis.close();
/* 263 */       tos.closeEntry();
/*     */     }
/*     */   }
/*     */   
/*     */   private static void usage(Options opts) {
/* 268 */     new HelpFormatter().printHelp(ItemDataFile.class.getSimpleName() + " [options] file", opts);
/*     */     
/* 270 */     System.exit(1);
/*     */   }
/*     */   
/*     */   public static void main(String[] args) {
/* 274 */     String cset = null;
/* 275 */     Options opts = new Options();
/* 276 */     CommandLineParser parser = new GnuParser();
/*     */     
/* 278 */     opts.addOption("a", "assemble", false, "assemble backup");
/* 279 */     opts.addOption("c", "charset", true, "path charset");
/* 280 */     opts.addOption("e", "extract", false, "extract backup");
/* 281 */     opts.addOption("h", "help", false, "help");
/* 282 */     opts.addOption("l", "list", false, "list backup");
/* 283 */     opts.addOption("n", "nometa", false, "ignore metadata");
/* 284 */     opts.addOption("p", "path", true, "extracted backup path");
/* 285 */     opts.addOption("t", "types", true, "item types");
/* 286 */     ZimbraLog.toolSetupLog4j("ERROR", null);
/*     */     try {
/* 288 */       CommandLine cl = parser.parse(opts, args);
/* 289 */       String path = ".";
/* 290 */       String file = null;
/* 291 */       boolean meta = true;
/* 292 */       Set<MailItem.Type> types = null;
/*     */       
/* 294 */       if (cl.hasOption('c')) {
/* 295 */         cset = cl.getOptionValue('c');
/*     */       }
/* 297 */       if (cl.hasOption('n')) {
/* 298 */         meta = false;
/*     */       }
/* 300 */       if (cl.hasOption('p')) {
/* 301 */         path = cl.getOptionValue('p');
/*     */       }
/* 303 */       if (cl.hasOption('t')) {
/*     */         try {
/* 305 */           types = MailItem.Type.setOf(cl.getOptionValue('t'));
/*     */         } catch (IllegalArgumentException e) {
/* 307 */           throw MailServiceException.INVALID_TYPE(e.getMessage());
/*     */         }
/*     */       }
/* 310 */       if ((cl.hasOption('h')) || (cl.getArgs().length != 1)) {
/* 311 */         usage(opts);
/*     */       }
/* 313 */       file = cl.getArgs()[0];
/* 314 */       if (cl.hasOption('a')) {
/* 315 */         create(path, types, cset, new FileOutputStream(file));
/* 316 */       } else if (cl.hasOption('e')) {
/* 317 */         extract(new FileInputStream(file), meta, types, cset, path);
/* 318 */       } else if (cl.hasOption('l')) {
/* 319 */         list(file.equals("-") ? System.in : new FileInputStream(file), types, cset, System.out);
/*     */       } else {
/* 321 */         usage(opts);
/*     */       }
/*     */     } catch (Exception e) {
/* 324 */       if ((e instanceof UnrecognizedOptionException)) {
/* 325 */         usage(opts);
/*     */       } else
/* 327 */         e.printStackTrace(System.out);
/* 328 */       System.exit(1);
/*     */     }
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/service/util/ItemDataFile.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */